<?php
/*
	Copyright 2006-2007  Alex Djachenko
	Authors: Alex Djachenko
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

    Принять участие в разработке или скачать новую версию вы можете на сайте
    http://code.google.com/p/my-site-framework/
*/

// !! Вывод списка записей
// !! Контроль доступа

/**
 * Контроллер форм. Базовый класс
 */
abstract class qsform_formController
{
	// Базовый путь к форме
	protected $basepath = 'LEVEL';
	// Базовый путь к форме
	protected $Switcher = null;
	// ID текущей записи в форме
	protected $id = null;
	// Данные текущей записи в форме
	protected $data = null;
	// Форма содержит ошибки?
	protected $is_error = false;
	// Сообщения об ошибках валидации
	protected $error = null;
	// Код формы
	protected $code = 'qsform_form';
	// Заголовок формы
	protected $header = '';
	// Кнопка сохранения
	protected $submit = 'Сохранить';

	function __construct($Switcher,$code,$basepath = 'LEVEL',$header='',$submit='Сохранить')
	{
		$this->Switcher = $Switcher;
		$this->code = $code;
		$this->basepath = $basepath;
		$this->header = $header;
		$this->submit = $submit;
	}
	/**
	 * Встраиваем форму в дерево URL (запускаем) 
	 */
	public function switcher($id_lock=null)
	{
	    $do = $this->Switcher->next();
        if (is_null($id_lock))
        {
            // Смена id не заблокирована
            $id = $this->Switcher->next();
        }else
        {
            $id = $id_lock;
        }
		switch ($do)
		{
			case 'save':
				// Сохраняем данные формы

				if (($id_status = $this->setId($id) !== false)
						AND $this->get()
						AND !$this->is_error)
				{
					// Данные есть
					$id2 = $this->save();
					// Перенаправляем пользователя на страницу с результатами
					$this->Switcher->tml_redirect($this->url('ok',$id2));
				}else
				{
					if ($this->is_error)
					{
						$this->message('error','Форма заполнена неверно');
					}elseif ($id_status === false)
					{
						$this->message('error','Ошибка при передаче ID записи');
					}else
					{
						$this->message('error','Данные не отправлены');
					}
					// Снова показываем форму
					$this->show();
				}
			break;
			case 'edit':
				// Отображение записи на редактирование
				// Загружаем запись по id
				$this->load($id);
				// Загружаем запись из БД
				
				// Показываем форму
				$this->show();
			break;
			case 'ok':
				// Сбрасываем данные
				$this->message('notice','Запись сохранена');
				$this->reset();
			default:
			case '':
				// Показываем форму
				$this->show();
			break;
		}
	}
	/**
	 * Возвращает URL формы
	 */
	public function url($do,$id=null)
	{
		if (is_null($id))
		{
			$id = '';
		}else
		{
			$id = '/'.intval($id);
		}
		switch ($do)
		{
			case 'save':
				return $this->Switcher->url($this->basepath.'/save'.$id);
			break;
			case 'edit':
				return $this->Switcher->url($this->basepath.'/edit'.$id);
			break;
			case 'ok':
				return $this->Switcher->url($this->basepath.'/ok'.$id);
			break;			
			case '':
			default:
				return $this->Switcher->url($this->basepath);
			break;
		}
	}
	/**
	 * Отображение формы
	 */
	protected function show()
	{
		$form = new HTML_QuickForm($this->code,
								'post', 
								$this->url('save',$this->id));
		if ($this->header)
		{
			$form->addElement('header', null, $this->header);
		}
		$this->show_adds($form);
		$form->addElement('submit', '', $this->submit);
		$form->addElement('reset', '', 'Восстановить');
		$form->display();
	}
	/**
	 * Эту функцию можно переопределить и добавить свои поля в форму
	 */
	protected function show_adds(&$form)
	{
		$form->addElement('text', $this->code.'_data'.'[test]', 'Тестовое поле');
	}
	/**
	 * Отображение сообщения о работе формы
	 */
	protected function message($type='html',$text)
	{
		switch ($type)
		{
			case 'error':
				echo "<div style='padding: 5px;margin:5px;text-align: center; border: 2;color: #FF0000'>{$text}</div>";
			break;
			case 'notice':
				echo "<div style='padding: 5px;margin:5px;text-align: center; border: 1;border-width: 1px;'>{$text}</div>";
			break;
			case 'html':
				echo $text;
			default:
			break;
		}
	}
	/**
	 * Получение данных из формы
	 */
	protected function get()
	{
		if (!isset($_POST[$this->code.'_data']) OR !is_array($_POST[$this->code.'_data']))
		{
			// Форма не отправлена или не содержит нужных данных
			return false;
		}else
		{
			// Получаем данные формы
			$data = $_POST[$this->code.'_data'];
			// Проверяем данные с включенными пользовательскими сообщениями
			$this->is_error = $this->validate($data,false);
			// Фильтруем данные формы
			$this->setData($data,false);
			return true;
		}
	}
	/**
	 * Проверка данных формы
	 * @var $noseterror - устанавливать ли пользовательские сообщения
	 * @return bool false - данные коректны
	 */
	protected function validate($data,$noseterror=false)
	{
	    if (!$noseterror)
	    {
	        $this->setError(null);
	    }
		return false;
	}
	/**
	 * Фильтруем данные перед сохранением
	 */
	protected function filter($data)
	{
		return $data;
	}
	/**
	 * Сохранение данных формы
	 */
	protected function save()
	{
		if (is_null($this->id))
		{
			return $this->dbInsert();
		}else
		{
			return $this->dbUpdate();
		}
	}
	/**
	 * Получаем данные из БД
	 */
	abstract protected function dbGet();
	/**
	 * Добавляем данные в БД
	 */
	abstract protected function dbInsert();
	/**
	 * Обновляем данные в БД
	 */
	abstract protected function dbUpdate();
	// **************************************
	/**
	 * Сброс данных формы
	 */
	public function reset()
	{
		$this->id = null;
		$this->data = null;
		$this->error = null;
	}
	/**
	 * Загрузить из БД запись в форму на редактирование
	 */
	public function load($id)
	{
		$this->setId($id);
		// Загружаем запись из БД
		if ($this->id)
		{
			// Загружаем информацию из БД
			if ($this->dbGet())
			{
				return true;
			}
		}
		return false;
	}
	/**
	 * Устанавливаем ID записи в форму
	 */
	public function setId($id)
	{
		if (!is_int($id) AND empty($id))
		{
			return null;
		}
		if ((string)$id !== (string)(int)$id)
		{
			// Переданный id не является десятичным числом
			return false;
		}
		$this->id = intval($id);
		return true;
	}
	/**
	 * Устанавливаем данные в форму
	 */
	public function setData($data,$nofileter=false)
	{
		if (!$nofileter)
		{
			// Фильтруем данные
			$data = $this->filter($data);
		}
		$this->data = $data;
	}
	/**
	 * Устанавливаем сообщения об ошибках в форму
	 */
	protected function setError($error)
	{
		$this->error = $error;
	}
}
?>